package com.zf.actuator.endpoint.health;

import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;

import java.util.concurrent.ThreadLocalRandom;


/**
 * 自定义 一个 health 指示器组件，方式 2：
 */
@Component
public class MyCustom2HealthIndicator extends AbstractHealthIndicator {

    /**
     * 返回该组件指示器的健康状态,并设置信息
     * <p>
     * 单个指示器在health端点返回中的内容样例：
     * <pre>
     * {@code
     * "myCustom2": {
     *             "status": "UP",
     *             "details": {
     *                 "success": true
     *             }
     *         }
     * }
     * </pre>
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        int errorCode = check();
        if (errorCode % 2 != 0) {
            // 设置响应中的该指示器组件的status为DOWN，并设置组件的一些detail信息
            // 系统中可以定义多个 指示器组件 ，只要其中一个返回的 status='DOWN'，最终结果的 status也就是 DOWN
            builder.down().withDetail("success", false).withDetail("msg", "错误").build();
        } else {
            // 设置响应中的该指示器组件的status为 UP ，并设置组件的一些detail信息
            builder.up().withDetail("success", true).build();
        }

    }

    private int check() {
        // 检查各种组件的健康状态，如mongo, redis
        // 也可以做一些其他的操作
        return ThreadLocalRandom.current().nextInt();
    }

}

